package com.spark.common.core;

import lombok.Data;
import org.springframework.http.HttpStatus;

import java.io.Serializable;

/**
 * 接口返回数据格式
 *
 * @author LYCHEE
 * @date 2025/02/14 14:48
 */
@Data
public class Result<T> implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 成功标志
     */
    private boolean success = true;

    /**
     * 返回处理消息
     */
    private String message = "操作成功";

    /**
     * 返回代码
     * 200 成功
     * 其他失败
     */
    private Integer code = 0;

    /**
     * 返回数据对象 data
     */
    private T result;

    /**
     * 时间戳
     */
    private long timestamp = System.currentTimeMillis();

    /**
     * 无参构造
     */
    public Result() {

    }

    /**
     * 默认响应成功
     * @return Result<T>
     * @param <T> 类型
     */
    public static<T> Result<T> ok(){
        Result<T> result = new Result<T>();
        result.setCode(HttpStatus.OK.value());
        result.setMessage("操作成功");
        result.setResult((T) "操作成功");
        result.setSuccess(true);
        return result;
    }

    /**
     * 响应成功返回提示文字
     * @param msg 成功提示
     * @return Result<T>
     * @param <T> 类型
     */
    public static<T> Result<T> ok(String msg){
        Result<T> result = new Result<T>();
        result.setMessage(msg);
        result.setResult((T) msg);
        result.setSuccess(true);
        result.setCode(HttpStatus.OK.value());
        return result;
    }

    /**
     * 响应成功返回数据
     * @param data 成功数据
     * @return Result<T>
     * @param <T> 类型
     */
    public static<T> Result<T> ok(T data){
        Result<T> result = new Result<T>();
        result.setResult(data);
        result.setMessage("操作成功");
        result.setSuccess(true);
        result.setCode(HttpStatus.OK.value());
        return result;
    }

    /**
     * 响应成功返回提示文字+数据
     * @param msg 成功提示
     * @param data 成功数据
     * @return Result<T>
     * @param <T> 类型
     */
    public static<T> Result<T> ok(String msg, T data){
        Result<T> result = new Result<T>();
        result.setMessage(msg);
        result.setResult(data);
        result.setSuccess(true);
        result.setCode(HttpStatus.OK.value());
        return result;
    }

    /**
     * 默认响应失败
     * @return Result<T>
     * @param <T> 类型
     */
    public static<T> Result<T> fail(){
        Result<T> result = new Result<T>();
        result.setCode(HttpStatus.INTERNAL_SERVER_ERROR.value());
        result.setMessage("操作失败");
        result.setResult((T) "操作失败");
        result.setSuccess(false);
        return result;
    }

    /**
     * 响应失败返回提示文字
     * @param msg 错误信息
     * @return Result<T>
     * @param <T> 类型
     */
    public static<T> Result<T> fail(String msg){
        Result<T> result = new Result<T>();
        result.setMessage(msg);
        result.setResult((T) msg);
        result.setSuccess(false);
        result.setCode(HttpStatus.INTERNAL_SERVER_ERROR.value());
        return result;
    }

    /**
     * 响应失败返回code
     * @param code 错误代码
     * @return Result<T>
     * @param <T> 类型
     */
    public static<T> Result<T> fail(int code){
        Result<T> result = new Result<T>();
        result.setMessage("操作失败");
        result.setResult((T) "操作失败");
        result.setCode(code);
        result.setSuccess(false);
        return result;
    }

    /**
     * 响应失败返回提示文字+code
     * @param msg 错误信息
     * @param code 错误代码
     * @return Result<T>
     * @param <T> 类型
     */
    public static<T> Result<T> fail(String msg,int code){
        Result<T> result = new Result<T>();
        result.setMessage(msg);
        result.setResult((T) msg);
        result.setCode(code);
        result.setSuccess(false);
        return result;
    }

    /**
     * 响应失败返回提示文字+code+数据
     * @param msg 错误信息
     * @param code 错误代码
     * @param data 错误数据
     * @return Result<T>
     * @param <T> 类型
     */
    public static<T> Result<T> fail(String msg, int code, T data) {
        Result<T> result = new Result<T>();
        result.setMessage(msg);
        result.setCode(code);
        result.setResult(data);
        result.setSuccess(false);
        return result;
    }

    /**
     * 布尔类型返回
     * @param flag 布尔
     * @return Result<T>
     * @param <T> 类型
     */
    public static <T> Result<Boolean> flag(boolean flag){
        return flag(flag, "操作成功", "操作失败");
    }

    /**
     * 布尔类型返回提示文字
     * @param flag 布尔
     * @param okMsg 返回成功提示文字
     * @param failMsg 返回失败提示文字
     * @return Result<T>
     * @param <T> 类型
     */
    public static <T> Result<Boolean> flag(boolean flag, String okMsg, String failMsg) {
        return flag ? ok(okMsg) : fail(failMsg);
    }

    /**
     * int类型返回
     * @param flag 数值
     * @return Result<T>
     * @param <T> 类型
     */
    public static <T> Result<Boolean> flag(int flag){
        return flag(flag > 0);
    }

    /**
     * int类型返回提示文字
     * @param flag 数值
     * @param okMsg 返回成功提示文字
     * @param failMsg 返回失败提示文字
     * @return Result<T>
     * @param <T> 类型
     */
    public static <T> Result<Boolean> flag(int flag, String okMsg, String failMsg){
        return flag(flag > 0, okMsg, failMsg);
    }
}
